// 1.引入axios
import Axios from 'axios'
import store from '../store'
// import router from '../router'
import { RefreshTokenApI } from '../api'
// 1.2.创建一个新的axios实列
const axios = Axios.create({
  // baseURL: 'http://geek.itheima.net',
  baseURL: 'http://toutiao.itheima.net',
  timeout: 20000
})
// 1.4 封装一个请求拦截器
// 1.4.1 添加请求拦截器
// 在发生请求之前需要做什么？将token放在请求头中
// 1.4.2判断当前是否有tkoen 并且判断当前headers.Authorization是不是undefined
// 1.4.3如果是需要把在请求中把请求头携带过去并且加上token
// 这样所有api接口里不用写携带Headers+Token
axios.interceptors.request.use(config => {
  if (store.state.token.length > 0 && config.headers.Authorization === undefined) {
    config.headers.Authorization = 'Bearer ' + store.state.token
  }
  return config
},
error => {
  // 如果请求错误的返回值
  return Promise.reject(error)
})

// 1.5 在响应回来后，马上执行响应拦截器函数
// eg：判断是否错误401，统一进行权限判断
// 如果token身份过期
// token续签方式：跳到登录页重新登录，token清空-确保路由守卫if进不去
// 1.6.token过期401,强制跳转到登录页，清空本地和store中的token数据
// 提高用户体验：用refresh_token无感知的刷新一个新的token回来
// 替换旧的token的同时，继续上次未完成的请求。
axios.interceptors.response.use(response => {
  return response
}, async error => {
  // 对响应错误判断
  // console.dir(error)
  if (error.response.status === 401) {
    // store.commit('setToken', '')
    // router.push({ path: '/login' })
    store.commit('setToken', '')
    const res = await RefreshTokenApI()
    store.commit('setToken', res.data.data.token)
    // error.config就是上一次axios请求的配置对象
    // console.log(error.config);
    // 把新的token赋予到下一次的axios请求的请求中--其实多刷新也可以得到最新token
    // 目的为了实现用户无感知;在不知道情况下
    error.config.headers.Authorization = 'Bearer ' + res.data.data.token
    return Axios(error.config)// return到await地方
  }
  return Promise.reject(error)
})

// 1.3导出axios--导出自定义函数, 参数对象解构赋值 最后导出
export default ({ url, method = 'GET', data, params, headers }) => {
  return axios({
    url,
    method,
    data,
    params,
    headers
  })
}
